/****************************************************************************
  @file    : tvbox_76.c
  @Version : V1.0
  @Company : Nanjing Puietel Internet of Things technology Co., Ltd.
  @author  : chenyy
  @date    : 2018-04-03
  @brief   : 
*****************************************************************************/
/* Includes ----------------------------------------------------------------*/
#include "remote.h"
#include "string.h"
#include "tvbox.h"

/* Private typedef ---------------------------------------------------------*/
/* Private define ----------------------------------------------------------*/
//时间定义
#define  BOX_LEADCODE_TIME_H    (uint16_t)( 0x8000   | (uint16_t)9000 )
#define  BOX_LEADCODE_TIME_L    (uint16_t)( (~0x8000)& (uint16_t)4500 )
#define  BOX_ENDCODE_TIME_H     (uint16_t)( 0x8000   | (uint16_t)560  )
#define  BOX_ENDCODE_TIME_L       (uint16_t)( (~0x8000)& (uint16_t)20000)
#define  BOX_BIT0_TIME_H      (uint16_t)( 0x8000   | (uint16_t)560  )
#define  BOX_BIT0_TIME_L      (uint16_t)( (~0x8000)& (uint16_t)560  )
#define  BOX_BIT1_TIME_H      (uint16_t)( 0x8000   | (uint16_t)560  )
#define  BOX_BIT1_TIME_L      (uint16_t)( (~0x8000)& (uint16_t)1680 )

//键值编码
static const uint8_t BOX_Code[TVBOX_KEY_NUM] = {
0x00, //0x01（扩展-开关）
0x00, //0x02（扩展-AV/TV）
0x00, //0x03（扩展-音量+）
0x00, //0x04（扩展-音量-）
0x00, //0x05（扩展-频道+）
0x00, //0x06（扩展-频道-）
0x00, //0x07（扩展-保留）
0x00, //0x08（扩展-保留）
0x00, //0x09（扩展-保留）
0x00, //0x0A（扩展-保留）
0xDC, //0x0B（开关）
0xC5, //0x0C（菜单）
0xC3, //0x0D（信息）
0x95, //0x0E（返回）
0x9C, //0x0F（静音）
0x98, //0x10（声道）
0x80, //0x11（音量+）
0x81, //0x12（音量-）
0x85, //0x13（频道+）
0x86, //0x14（频道-）
0xCA, //0x15（上）
0xD2, //0x16（下）
0x99, //0x17（左）
0xC1, //0x18（右）
0xCE, //0x19（确定）
0x00, //0x1A（信号源）
0x88, //0x1B（主页）
0x00, //0x1C（保留）
0x00, //0x1D（保留）
0x87, //0x1E（数字0）
0x92, //0x1F（数字1）
0x93, //0x20（数字2）
0xCC, //0x21（数字3）
0x8E, //0x22（数字4）
0x8F, //0x23（数字5）
0xC8, //0x24（数字6）
0x8A, //0x25（数字7）
0x8B, //0x26（数字8）
0xC4, //0x27（数字9）
0xDA,  //0x28（输入法）
};

/* Private macro -----------------------------------------------------------*/
/* Private variables -------------------------------------------------------*/
static uint16_t BoxSendlen = 0;

/* Private function prototypes ---------------------------------------------*/
static void PackageByte(uint8_t byte);

/* Private functions -------------------------------------------------------*/
static void PackageByte(uint8_t byte) {
  uint8_t i;

  for(i = 0; i<8; i++) {
    if(byte&(0x01<<(i))) {  //高电平
      IrSendBuf[BoxSendlen++] = BOX_BIT1_TIME_H;
      IrSendBuf[BoxSendlen++] = BOX_BIT1_TIME_L;
    } else {        //低电平
      IrSendBuf[BoxSendlen++] = BOX_BIT0_TIME_H;
      IrSendBuf[BoxSendlen++] = BOX_BIT0_TIME_L;
    }
  }
}

/* Public functions --------------------------------------------------------*/
void TVBox76IrPackage(void *p) {
  uint8_t  i,p_byte = 0x00;

  uint8_t codeNum = *(uint8_t*)p;

  if(codeNum == 0 || codeNum >= TVBOX_KEY_NUM) return ;
  
  p_byte = BOX_Code[codeNum-1];

  if(p_byte == 0x00) return;
  
  //等待发送完成
  //while(IrDev.State != IRREMOTE_IDLE);  
  memset(IrSendBuf, 0, sizeof(IrSendBuf)/sizeof(uint16_t));

  BoxSendlen = 0;

  //配置引导码
  IrSendBuf[BoxSendlen++] = BOX_LEADCODE_TIME_H;
  IrSendBuf[BoxSendlen++] = BOX_LEADCODE_TIME_L;

  //配置控制码
  PackageByte(0x22);
  PackageByte(0xDD);
  PackageByte(p_byte);
  PackageByte(~p_byte);

  //配置结束码
  IrSendBuf[BoxSendlen++] = BOX_ENDCODE_TIME_H;
  IrSendBuf[BoxSendlen++] = BOX_ENDCODE_TIME_L;
  
  //组包完成提交
  IrDev.Ptr     = IrSendBuf;
  IrDev.Len     = BoxSendlen;
  IrDev.State   = IRREMOTE_REQUIRE;
}
